<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Send/SendRaw/SendInput/SendPlay/SendEvent: Send keys &amp; clicks</title>
<meta name="description" content="Send keystrokes and mouse clicks to any window with this free macro program. SendInput is generally the fastest and most reliable method.">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link href="../css/default.css" rel="stylesheet" type="text/css">
<style type="text/css">
<!--
.red {color: #FF0000; font-weight: bold;}
-->
</style>
</head>
<body>

<h1>Send / SendRaw / SendInput / SendPlay / SendEvent: 发送按键和点击</h1>

<p>发送模拟键击和鼠标点击到 <a href="WinActivate.htm">活动</a> 窗口.</p>

<pre class="Syntax">Send Keys
SendRaw Keys
SendInput Keys
SendPlay Keys
SendEvent Keys</pre>
<h3>参数</h3>
<table class="info">
  <tr>
    <td width="15%">Keys</td>
    <td width="85%">要发送的按键序列. 和其他命令一样, 在首个参数前的逗号可以省略.</td>
  </tr>
</table>

<p><strong><a name="SendRaw"></a>原始模式</strong>: <em>SendRaw</em> 命令会准确按照键击显示的那样发送, 而不把 {Enter} 转换成 ENTER 键击, 把 ^c 转换成 Control-C 等. 要在 SendInput, SendPlay 和 SendEvent 中使用原始模式, 把 <a href="#Raw">{Raw}</a> 写在需发送的按键序列前面; 例如: <em>SendInput {Raw}abc</em></p>
<p><strong>正常模式</strong>: 不处于原始模式时, 下列字符被看成是修饰键 (这些修饰键仅影响紧跟着的下一个键):</p>
<p><span class="red">!</span>: 发送一个 ALT 键击. 例如, <em>Send This is text!a</em> 将发送按键序列 "This is text" 并接着按下 ALT+a. <strong>注意</strong>: 在某些程序中 !A 和 !a 会产生不同的效果. 这是由于 !A 按了 ALT+SHIFT+A 而 !a 按了 ALT+a. 如果不确定, 则使用小写.</p>
<p><span class="red">+</span>: 发送一个 SHIFT 键击. 例如, <em>Send +abC </em> 会发送文本 "AbC", 而 <em>Send !+a</em> 会按下 ALT+SHIFT+a.</p>
<p><span class="red">^</span>: 发送一个 CONTROL 键击. 例如, <em>Send ^!a</em> 会按下 CTRL+ALT+a, 而 <em>Send ^{Home}</em> 则发送 CONTROL+HOME. <strong>注意</strong>: 在某些程序中 ^A 和 ^a 会产生不同的效果. 这是由于 ^A 按了 CONTROL+SHIFT+A 而 ^a 按了 CONTROL+a. 如果不确定, 则使用小写.</p>
<p><span class="red">#</span>: 发送一个 WIN 键击, 因此 <em>Send #e</em> 会按住 Windows 接着按下字母 "e".</p>
<p><br>
<a name="SendInput"></a><a name="SendPlay"></a><strong>SendInput</strong> 和 <strong>SendPlay</strong> <span class="ver">[v1.0.43+]:</span> SendInput 和 SendPlay 与 Send 使用相同的语法但通常更快更可靠. 此外, 它们缓存了发送期间任何物理的键盘或鼠标活动, 这样避免了在发送时夹杂用户的键击. 可以使用 <a href="SendMode.htm">SendMode</a> 让 Send 和 SendInput 或 SendPlay 具有相同的功能. 关于每种模式的更多细节, 参见下面的 <a href="#SendInputDetail">SendInput</a> 和 <a href="#SendPlayDetail">SendPlay</a>.</p>
<p><a name="SendEvent"></a><strong>SendEvent</strong> <span class="ver">[v1.0.43+]:</span> SendEvent 和 1.0.43 之前版本的 <em>Send</em> 命令使用相同的方法发送键击. 键击发送的频率由 <a href="SetKeyDelay.htm">SetKeyDelay</a> 决定. 默认情况下, <em>Send</em> 和 <em>SendEvent</em> 是含义一样的; 但通过 <a href="SendMode.htm">SendMode</a> 可以让它变成和 <a href="#SendInputDetail">SendInput</a> 或 <a href="#SendPlayDetail">SendPlay</a> 一样.</p>
<p><strong>按键名称</strong>: 下面的表格列出了可以发送的特殊按键 (每个按键名称必须用大括号包围):</p>
<table class="info">
  <tr>
    <th width="200">按键名称</th>
    <th>生成的键击</th>
  </tr>
  <tr>
    <td align="center">{F1} - {F24}</td>
    <td>功能键. 例如: {F12} 表示 F12 键.</td>
  </tr>
  <tr>
    <td align="center">{!}</td>
    <td>!</td>
  </tr>
  <tr>
    <td align="center">{#}</td>
    <td>#</td>
  </tr>
  <tr>
    <td align="center">{+}</td>
    <td>+</td>
  </tr>
  <tr>
    <td align="center">{^}</td>
    <td>^</td>
  </tr>
  <tr>
    <td align="center">{{}</td>
    <td>{</td>
  </tr>
  <tr>
    <td align="center">{}}</td>
    <td>}</td>
  </tr>
  <tr>
    <td align="center">{Enter}</td>
    <td>主键盘上的 ENTER 键</td>
  </tr>
  <tr>
    <td align="center">{Escape} 或 {Esc}</td>
    <td>ESCAPE</td>
  </tr>
  <tr>
    <td align="center">{Space}</td>
    <td>SPACE (仅对于需发送的按键序列开始或末尾的空格才需要这样表示 -- 序列中间的空格是原义的)</td>
  </tr>
  <tr>
    <td align="center">{Tab}</td>
    <td>TAB</td>
  </tr>
  <tr>
    <td align="center">{Backspace} 或 {BS}</td>
    <td>Backspace</td>
  </tr>
  <tr>
    <td align="center">{Delete} 或 {Del}</td>
    <td>Delete</td>
  </tr>
  <tr>
    <td align="center">{Insert} 或 {Ins}</td>
    <td>Insert</td>
  </tr>
  <tr>
    <td align="center">{Up}</td>
    <td>主键盘上的向上方向键</td>
  </tr>
  <tr>
    <td align="center">{Down}</td>
    <td>主键盘上的向下方向键</td>
  </tr>
  <tr>
    <td align="center">{Left}</td>
    <td>主键盘上的向左方向键</td>
  </tr>
  <tr>
    <td align="center">{Right}</td>
    <td>主键盘上的向右方向键</td>
  </tr>
  <tr>
    <td align="center">{Home}</td>
    <td>主键盘上的 Home 键</td>
  </tr>
  <tr>
    <td align="center">{End}</td>
    <td>主键盘上的 End 键</td>
  </tr>
  <tr>
    <td align="center">{PgUp}</td>
    <td>主键盘上的 Page-up 键</td>
  </tr>
  <tr>
    <td align="center">{PgDn}</td>
    <td>主键盘上的 Page-down 键</td>
  </tr>
  <tr>
    <th>&nbsp;</th>
    <th>&nbsp;</th>
  </tr>
  <tr>
    <td align="center">{CapsLock}</td>
    <td>CapsLock (在 NT/2k/XP 系统上使用 <a href="SetNumScrollCapsLockState.htm">SetCapsLockState</a> 更可靠). 发送 {CapsLock} 前可能要求 <a href="SetStoreCapslockMode.htm">SetStoreCapslockMode Off</a>.</td>
  </tr>
  <tr>
    <td align="center">{ScrollLock}</td>
    <td>ScrollLock (也请参见: <a href="SetNumScrollCapsLockState.htm">SetScrollLockState</a>)</td>
  </tr>
  <tr>
    <td align="center">{NumLock}</td>
    <td>NumLock (也请参见: <a href="SetNumScrollCapsLockState.htm">SetNumLockState</a>)</td>
  </tr>
  <tr>
    <th>&nbsp;</th>
    <th>&nbsp;</th>
  </tr>
  <tr>
    <td align="center">{Control} or {Ctrl} </td>
    <td>CONTROL (技术信息: 发送中性的虚拟按键和左边的扫描代码, 即在 vkXXscYYY 中, XX 为中性的而 YYY 为左边的扫描代码)</td>
  </tr>
  <tr>
    <td align="center">{LControl} or {LCtrl}</td>
    <td>左 CONTROL 键 (技术信息: 在 Win9x 中等同于 CONTROL, 但在 NT/2k/XP 系统中它发送左边的虚拟按键而不是中性的)</td>
  </tr>
  <tr>
    <td align="center">{RControl} or {RCtrl}</td>
    <td>右 CONTROL 键</td>
  </tr>
  <tr>
    <td align="center">{Control Down} 或 {Ctrl Down}</td>
    <td>按住 CONTROL 键直到发送 {Ctrl Up}. XP/2000/NT: 要按住左边或右边的键, 请使用 {RCtrl Down} 和 {RCtrl Up}. </td>
  </tr>
  <tr>
    <th>&nbsp;</th>
    <th>&nbsp;</th>
  </tr>
  <tr>
    <td align="center">{Alt}</td>
    <td>ALT (技术信息: 发送中性的虚拟按键和左边的扫描代码)</td>
  </tr>
  <tr>
    <td align="center">{LAlt}</td>
    <td>左 ALT 键 (技术信息: 在 Win9x 中等同于 ALT, 但在 NT/2k/XP 系统中它发送左边的虚拟按键而不是中性的) </td>
  </tr>
  <tr>
    <td align="center">{RAlt}</td>
    <td>右 ALT 键 (或 AltGr, 取决于键盘布局)</td>
  </tr>
  <tr>
    <td align="center">{Alt Down}</td>
    <td>按住 ALT 键直到发送 {Alt Up}. XP/2000/NT: 要按住左边或右边的键, 请使用 {RAlt Down} 和 {RAlt Up}.</td>
  </tr>
  <tr>
    <th>&nbsp;</th>
    <th>&nbsp;</th>
  </tr>
  <tr>
    <td align="center">{Shift}</td>
    <td> SHIFT (技术信息: 发送中性的虚拟按键和左边的扫描代码)</td>
  </tr>
  <tr>
    <td align="center">{LShift}</td>
    <td>左 SHIFT 键 (技术信息: 在 Win9x 中等同于 SHIFT, 但在 NT/2k/XP 系统中它发送左边的虚拟按键而不是中性的) </td>
  </tr>
  <tr>
    <td align="center">{RShift}</td>
    <td>右 SHIFT 键</td>
  </tr>
  <tr>
    <td align="center">{Shift Down}</td>
    <td>按住 SHIFT 键直到发送 {Shift Up}. XP/2000/NT: 要按住左边或右边的键, 请使用 {RShift Down} 和 {RShift Up}.</td>
  </tr>
  <tr>
    <th>&nbsp;</th>
    <th>&nbsp;</th>
  </tr>
  <tr>
    <td align="center">{LWin}</td>
    <td>左 Windows 键</td>
  </tr>
  <tr>
    <td align="center">{RWin}</td>
    <td>右 Windows 键</td>
  </tr>
  <tr>
    <td align="center">{LWin Down}</td>
    <td>按住左 Windows 键直到发送 {LWin Up}</td>
  </tr>
  <tr>
    <td align="center">{RWin Down}</td>
    <td>按住右 Windows 键直到发送 {RWin Up}</td>
  </tr>
  <tr>
    <th>&nbsp;</th>
    <th>&nbsp;</th>
  </tr>
  <tr>
    <td align="center">{AppsKey}</td>
    <td>Windows App 键 (调用右键点击或上下文菜单) </td>
  </tr>
  <tr>
    <td align="center">{Sleep}</td>
    <td>电脑 SLEEP 键.</td>
  </tr>
  <tr>
    <td align="center">{ASC nnnnn}</td>
    <td><p><a name="asc"></a>发送 ALT+nnnnn 小键盘上的按键组合, 可以用来生成键盘上不存在的特殊字符. 要生成 ASCII 字符, 指定一个介于 1 和 255 之间的数字. 要生成 ANSI 字符 (在多数语言中的标准), 指定一个介于 128 和 255 之间的数字, 但需要在数字前加上一个前导零, 例如 {Asc 0133}.</p>
    <p>要生成 Unicode 字符, 指定一个介于 256 和 65535 之间的数字 (不带前导零). 但是, 有些应用程序不支持这种情况. 因此, 为了更可靠和更简便的发送长的 Unicode 字符串, 使用 "<a href="Transform.htm#unicode">Transform Unicode</a>".</p></td>
  </tr>
  <tr id="Unicode">
    <td align="center">{U+nnnn}</td>
    <td><p><a name="sendu"></a><span class="ver">[AHK_L 24+]:</span> 发送一个 Unicode 字符, 其中 <em>nnnn</em> 为不包括 0x 前缀的字符的十六进制值. 请注意 AutoHotkey_L 的 Unicode 版本中, 如果脚本文件保存为 UTF-8 或 UTF-16 时文本中可以直接包含 Unicode 字符.</p>
    <p>如果这个字符没有映射为一个虚拟按键代码, 则使用 <a href="http://msdn.microsoft.com/en-us/library/ms646310.aspx">SendInput()</a> 或 <a href="http://msdn.microsoft.com/en-us/library/ms646276.aspx">WM_CHAR</a> 发送这个字符而当前的发送模式无效.</p></td>
  </tr>
  <tr>
    <td align="center"><p>{vkXX}<br>
      {scYYY}<br>
    {vkXXscYYY}</p>    </td>
    <td><p><a name="vk"></a>发送一个虚拟按键为 XX 且扫描码为 YYY 的键击. 例如: <em>Send {vkFFsc159}</em>. 如果省略了 sc 或 vk 部分, 则会发送最适当的值.</p>
      <p>XX 和 YYY 是十六进制的值, 通常可以在主窗口中打开 <a href="KeyHistory.htm">View-&gt;Key history</a> 菜单项查看. 也请参见: <a href="../KeyList.htm#SpecialKeys">特殊按键</a></p></td>
  </tr>
  <tr>
    <th>&nbsp;</th>
    <th>&nbsp;</th>
  </tr>
  <tr>
    <td align="center">{Numpad0} - {Numpad9}</td>
    <td>小键盘上的数字键 (与 Numlock 打开时输入的一样). 例如: {Numpad5} 为数字 5.</td>
  </tr>
  <tr>
    <td align="center">{NumpadDot}</td>
    <td>小键盘上的点 (与 Numlock 打开时输入的一样).</td>
  </tr>
  <tr>
    <td align="center">{NumpadEnter}</td>
    <td>小键盘上的 Enter 键</td>
  </tr>
  <tr>
    <td align="center">{NumpadMult}</td>
    <td>小键盘上的乘</td>
  </tr>
  <tr>
    <td align="center">{NumpadDiv}</td>
    <td>小键盘上的除</td>
  </tr>
  <tr>
    <td align="center">{NumpadAdd}</td>
    <td>小键盘上的加</td>
  </tr>
  <tr>
    <td align="center">{NumpadSub}</td>
    <td>小键盘上的除</td>
  </tr>
  <tr>
    <th>&nbsp;</th>
    <th>&nbsp;</th>
  </tr>
  <tr>
    <td align="center">{NumpadDel}</td>
    <td>小键盘上的 Delete 键 (此键和后面的小键盘按键是当 Numlock 关闭时输入的)</td>
  </tr>
  <tr>
    <td align="center">{NumpadIns}</td>
    <td>小键盘上的 Insert 键 </td>
  </tr>
  <tr>
    <td align="center">{NumpadClear}</td>
    <td>小键盘上的 Clear 键 (通常为 '5' 键在 Numlock 关闭时输入的).</td>
  </tr>
  <tr>
    <td align="center">{NumpadUp}</td>
    <td>小键盘上的向上方向键 </td>
  </tr>
  <tr>
    <td align="center">{NumpadDown}</td>
    <td>小键盘上的向下方向键 </td>
  </tr>
  <tr>
    <td align="center">{NumpadLeft}</td>
    <td>小键盘上的向左方向键 </td>
  </tr>
  <tr>
    <td align="center">{NumpadRight}</td>
    <td>小键盘上的向右方向键 </td>
  </tr>
  <tr>
    <td align="center">{NumpadHome}</td>
    <td>小键盘上的 Home 键 </td>
  </tr>
  <tr>
    <td align="center">{NumpadEnd}</td>
    <td>小键盘上的 End 键 </td>
  </tr>
  <tr>
    <td align="center">{NumpadPgUp}</td>
    <td>小键盘上的 Page-up 键 </td>
  </tr>
  <tr>
    <td align="center">{NumpadPgDn}</td>
    <td>小键盘上的 Page-down 键 </td>
  </tr>
  <tr>
    <th>&nbsp;</th>
    <th>&nbsp;</th>
  </tr>
  <tr>
    <td align="center">{Browser_Back}</td>
    <td>2000/XP/Vista+: 按下浏览器的 "后退" 按钮</td>
  </tr>
  <tr>
    <td align="center">{Browser_Forward}</td>
    <td>2000/XP/Vista+: 按下浏览器的 "前进" 按钮</td>
  </tr>
  <tr>
    <td align="center">{Browser_Refresh}</td>
    <td>2000/XP/Vista+: 按下浏览器的 "刷新" 按钮</td>
  </tr>
  <tr>
    <td align="center">{Browser_Stop}</td>
    <td>2000/XP/Vista+: 按下浏览器的 "停止" 按钮</td>
  </tr>
  <tr>
    <td align="center">{Browser_Search}</td>
    <td>2000/XP/Vista+: 按下浏览器的 "搜索" 按钮</td>
  </tr>
  <tr>
    <td align="center">{Browser_Favorites}</td>
    <td>2000/XP/Vista+: 按下浏览器的 "收藏" 按钮</td>
  </tr>
  <tr>
    <td align="center">{Browser_Home}</td>
    <td>2000/XP/Vista+: 运行浏览器并打开主页</td>
  </tr>
  <tr>
    <td align="center">{Volume_Mute}</td>
    <td>2000/XP/Vista+: 主音量静音/取消静音. 通常相当于 <em><a href="SoundSet.htm">SoundSet</a>, +1, , mute</em></td>
  </tr>
  <tr>
    <td align="center">{Volume_Down}</td>
    <td>2000/XP/Vista+: 减小主音量. 通常相当于 <em><a href="SoundSet.htm">SoundSet</a> -5 </em></td>
  </tr>
  <tr>
    <td align="center">{Volume_Up}</td>
    <td>2000/XP/Vista+: 增加主音量. 通常相当于 <em><a href="SoundSet.htm">SoundSet</a> +5</em></td>
  </tr>
  <tr>
    <td align="center">{Media_Next}</td>
    <td>2000/XP/Vista+: 在媒体播放器中播放下一曲目</td>
  </tr>
  <tr>
    <td align="center">{Media_Prev}</td>
    <td>2000/XP/Vista+: 在媒体播放器中播放前一曲目</td>
  </tr>
  <tr>
    <td align="center">{Media_Stop}</td>
    <td>2000/XP/Vista+: 停止媒体播放器</td>
  </tr>
  <tr>
    <td align="center">{Media_Play_Pause}</td>
    <td>2000/XP/Vista+: 播放/暂停媒体播放器</td>
  </tr>
  <tr>
    <td align="center">{Launch_Mail}</td>
    <td>2000/XP/Vista+: 启动电子邮件程序</td>
  </tr>
  <tr>
    <td align="center">{Launch_Media}</td>
    <td>2000/XP/Vista+: 启动媒体播放器</td>
  </tr>
  <tr>
    <td align="center">{Launch_App1}</td>
    <td>2000/XP/Vista+: 启动用户程序1</td>
  </tr>
  <tr>
    <td align="center">{Launch_App2}</td>
    <td>2000/XP/Vista+: 启动用户程序2</td>
  </tr>
  <tr>
    <th>&nbsp;</th>
    <th>&nbsp;</th>
  </tr>
  <tr>
    <td align="center">{PrintScreen}</td>
    <td>Print Screen </td>
  </tr>
  <tr>
    <td align="center">{CtrlBreak}</td>
    <td>Ctrl+break</td>
  </tr>
  <tr>
    <td align="center">{Pause}</td>
    <td>Pause</td>
  </tr>
  <tr>
    <th>&nbsp;</th>
    <th>&nbsp;</th>
  </tr>
  <tr>
    <td align="center"><strong>{Click [Options]}</strong><br>
    <span class="ver">[v1.0.43+]</span></td>
    <td><a name="Click"></a>使用与 <a href="Click.htm">Click 命令</a> 中相同的可用选项发送鼠标点击. 例如, {Click} 会在鼠标指针当前位置点击鼠标左键一次, 而 {Click 100, 200} 则在坐标 100, 200 处点击 (这里的坐标模式取决于 <a href="CoordMode.htm">CoordMode</a>). 要移动鼠标而不点击, 在坐标后指定 0; 例如: {Click 100, 200, 0}. 在鼠标点击之间的延迟由 <a href="SetMouseDelay.htm">SetMouseDelay</a> 决定 (而不是 <a href="SetKeyDelay.htm">SetKeyDelay</a>).</td>
  </tr>
  <tr>
    <td align="center">{WheelDown}, {WheelUp}, {WheelLeft}, {WheelRight}, {LButton}, {RButton}, {MButton}, {XButton1}, {XButton2}</td>
    <td>向指针当前位置发送鼠标按钮事件 (要指定位置和其他选项, 请使用上面的 <a href="Click.htm">{Click}</a>). 在鼠标点击之间的延迟由 <a href="SetMouseDelay.htm">SetMouseDelay</a> 决定. WheelLeft/Right 需要 1.0.48+ 版本支持, 并且在 Windows Vista 之前的操作系统中无效.</td>
  </tr>
  <tr>
    <td align="center"><strong>{Blind}</strong></td>
    <td><p><a name="blind"></a>当按键序列中首个项目为 {Blind} 时, 如果 Alt/Control/Shift/Win 在发送开始时为按下的状态则不松开. 例如, 热键 <em>+s::Send {Blind}abc</em> 将发送 ABC 而不是 abc 因为用户按住了 Shift 键.</p>
      <p>{Blind} 同时也会忽略 <a href="SetStoreCapslockMode.htm">SetStoreCapslockMode</a>; 即不会改变 Capslock 的状态. 最后, {Blind} 会忽略发送的键击中的额外控制功能; 这样的键击中可以避免后面的情况: 1) 发送 LWin/RWin 键击时出现开始菜单; 2) 发送 Alt 键击时激活菜单栏.</p>
      <p>在 <a href="../misc/Remap.htm">按键的重映射</a> 内部使用 Blind 模式. 例如, 重映射 a::b 会发生这样的情况: 1) 输入 "a" 时会映射为 "b"; 2) 输入大写字母 A 时映射为大写字母 B; 并且 3) 按下 Control-A 时映射为按了 Control-B.</p>
      <p>SendRaw 和 <a href="ControlSend.htm">ControlSendRaw</a> 不支持 {Blind}. 此外, <a href="#SendPlayDetail">SendPlay</a> 也不完全支持这种模式, 尤其在处理修饰键 (Control, Alt, Shift 和 Win) 时.</p></td>
  </tr>
  <tr>
    <td align="center"><strong>{Raw}</strong><br>
    <span class="ver">[v1.0.43+]</span></td>
    <td><a name="Raw" id="Raw"></a>准确按照键击显示的那样发送, 而不把 {Enter} 转换成 ENTER 键击, 把 ^c 转换成 Control-C 等. {Raw} 可以不放在按键序列的开始, 在按键序列中出现后, 它会影响它后面的剩余部分.</td>
  </tr>
</table>

<h2>重复或按住按键 </h2>
<p><strong>重复键击</strong>: 把需要重复的按键名称和重复次数写入到大括号中. 例如:</p>
<pre>Send {DEL 4}  <em>; 按 4 次 Delete 键.</em>
Send {S 30}   <em>; 发送 30 次大写字母 S.</em>
Send +{TAB 4}  <em>; 按 4 次 Shift-Tab.</em></pre>
<p><strong>按住或松开按键</strong>: 把按键名称和单词 <strong>Down</strong> 或 <strong>Up</strong>写入到大括号中. 例如:</p>
<pre>Send {b down}{b up}
Send {TAB down}{TAB up}
Send {Up down}  <em>; 按下向上方向键.</em>
Sleep 1000  <em>; 按住 1 秒.</em>
Send {Up up}  <em>; 松开向上方向键.</em></pre>
<p>使用上面的方法按住一个按键后, 这个期间它不会像您实际按住这个按键一样自动重复 (这是因为自动重复是一种驱动/硬件的特性). 不过, 可以使用 <a href="Loop.htm">Loop</a> 来模拟自动重复. 下面的例子中发送了 20 次 tab 键击:</p>
<pre>循环 20
{
    Send {Tab down}  <em>; 自动重复是由连续的按下事件组成 (没有弹起事件).</em>
    Sleep 30  <em>; 在两次键击之间的毫秒数 (或使用 <a href="SetKeyDelay.htm">SetKeyDelay</a> 设置).</em>
}
Send {Tab up}  <em>; 松开按键.</em></pre>
<p>还可以使用单词 <em>DownTemp</em>. 除了修饰键 (Control/Shift/Alt/Win) 外它的效果与 <em>Down</em> 相同. 在那些情况下, <em>DownTemp</em> 告知后续的 send 命令这个键不是永久按下, 并可能在需要时随时松开. 例如, <em>Send {Control DownTemp}</em> 之后接着 <em>Send a</em> 会产生一个普通的 "a" 键击, 而不是 control-A 键击.</p>
<h2>一般说明</h2>
<p>除了字母 A 到 Z 外, 还支持下列的字母和符号 (但是, 如果您系统上的代码页不是 1252 [US &amp; Western Europe], 这个列表可能会不一样):<br>
&euro;&sbquo;&fnof;&bdquo;&hellip;&dagger;&Dagger;&circ;&permil;&Scaron;&lsaquo;&OElig;Ž&lsquo;&rsquo;&ldquo;&rdquo;&bull;&ndash;&mdash;&tilde;&trade;&scaron;&rsaquo;&oelig;ž&Yuml;&nbsp;&iexcl;&cent;&pound;&curren;&yen;&brvbar;&sect;&uml;&copy;&ordf;&laquo;&not;&shy;&reg;&macr;&deg;&plusmn;&sup2;&sup3;&acute;&micro;&para;&middot;&cedil;&sup1;&ordm;&raquo;&frac14;&frac12;&frac34;&iquest;<br>
&Agrave;&Aacute;&Acirc;&Atilde;&Auml;&Aring;&AElig;&Ccedil;&Egrave;&Eacute;&Ecirc;&Euml;&Igrave;&Iacute;&Icirc;&Iuml;&ETH;&Ntilde;&Ograve;&Oacute;&Ocirc;&Otilde;&Ouml;&times;&Oslash;&Ugrave;&Uacute;&Ucirc;&Uuml;&Yacute;&THORN;&szlig;&agrave;&aacute;&acirc;&atilde;&auml;&aring;&aelig;&ccedil;&egrave;&eacute;&ecirc;&euml;&igrave;&iacute;&icirc;&iuml;&eth;&ntilde;&ograve;&oacute;&ocirc;&otilde;&ouml;&divide;&oslash;&ugrave;&uacute;&ucirc;&uuml;&yacute;&thorn;&yuml;</p>
<p><strong>BlockInput 与 SendInput/SendPlay 的比较</strong>: 尽管可以使用 <a href="BlockInput.htm">BlockInput</a> 命令防止用户输入的任何键击扰乱模拟键击流, 但使用 <a href="#SendInputDetail">SendInput</a> 或 <a href="#SendPlayDetail">SendPlay</a> 通常更好, 这样键击和鼠标点击会保持连续. 这是由于与 BlockInput 不同, SendInput/Play 不会丢弃发送期间用户输入的内容; 作为替代, 这样的键击被缓冲起来在之后发送.</p>
<p>发送大量键击时, 使用 <a href="../Scripts.htm#continuation">字串分段</a> 可以提高可读性和可维护性.</p>
<p>由于操作系统不允许程序模拟 CTRL-ALT-DELETE 组合键, 执行像 <em>Send ^!{Delete}</em> 的命令不会产生效果.</p>
<h2 id="SendInputDetail">SendInput <span class="ver">[v1.0.43+]</span></h2>
<p>由于 SendInput 突出的速度和可靠性, 通常作为发送键击和鼠标点击的首选方法. 在大多数情况下, SendInput 近乎瞬时发送的, 即使在发送长字符串时. 由于 SendInput 如此快速, 所以也更可靠, 因为这样其他一些窗口更没有机会出乎意料地弹出并打断正发送的键击. 可靠性进一步提升是通过把用户在 SendInput 发送期间输入的内容推迟的情况而言.</p>
<p>与其他发送模式不同, 操作系统限制 SendInput 每次只能发送大约 5000 个字符 (此限制可能因操作系统版本和性能设置而有所不同). 超过此限制的字符和事件不会被发送.</p>
<p><strong>注意:</strong> SendInput 会忽略 SetKeyDelay 设置, 因为在这种发送模式中操作系统不支持延迟. 但是, 在后面描述的情况中当 SendInput 恢复到 <a href="#SendEvent">SendEvent</a> 时, 它会使用 <em><a href="SetKeyDelay.htm">SetKeyDelay -1, 0</a></em> (但如果 SendEvent 的按键延迟为 "<em>-1,-1</em>" 时, 则使用 "<em>-1,-1</em>"). 当 SendInput 恢复为 <a href="#SendPlayDetail">SendPlay</a> 时, 它使用 SendPlay 的按键延迟.</p>
<p><a name="SendInputUnavail"></a>如果执行 SendInput 脚本外的 <em>其他</em> 脚本安装了 <a href="_InstallKeybdHook.htm">低级键盘钩子</a>, SendInput 会自动恢复为 <a href="#SendEvent">SendEvent</a> (或 <a href="#SendPlayDetail">SendPlay</a>, 当 <a href="SendMode.htm"><em>SendMode InputThenPlay</em></a> 有效的时候). 这是由于外部钩子的存在让 SendInput 失去了所有的优势, 使它不如 SendPlay 和 SendEvent 两者. 然而, 在 AutoHotkey 1.0.43 之前的版本中 SendInput 无法检测到底层键盘钩子, 在这些情况下将不会自动恢复使得比 SendPlay/Event 更不可靠.</p>
<p>当 SendInput 使用像 <a href="#Click">{Click}</a> 这样的方法发送鼠标点击, 并且 <a href="SetMouseDelay.htm"><em>CoordMode Mouse, Relative</em></a> 有效时(默认), 每次点击都会相对于发送开始时的那个活动窗口. 因此, 如果 SendInput 有意地激活另一个窗口 (通过像 alt-tab 这样的方法), 这个命令中后续点击的坐标将变成错误的, 因为它们仍然相对于原来的活动窗口而不是新的活动窗口.</p>
<p>Windows 95 (和 NT4 SP3 之前的系统): 不支持 SendInput 并自动恢复为 SendEvent (或 SendPlay, 如果 <a href="SendMode.htm"><em>SendMode InputThenPlay</em></a> 有效的话).</p>
<h2 id="SendPlayDetail">SendPlay <span class="ver">[v1.0.43+]</span></h2>
<p>比起其他模式 SendPlay 最大的优势是具有在相当多种游戏中 "play back" 键击和鼠标点击能力. 例如, 某种特殊的游戏可能仅接受 <a href="../Hotstrings.htm#SendMode">SendPlay 选项</a> 的 <a href="../Hotstrings.htm#SendMode">热字串</a>.</p>
<p>在三种发送模式中, SendPlay 是最不常用的, 因为它本身并不模拟键击和鼠标点击. 作为替代, 它制造一系列事件 (消息) 直接流向活动窗口 (类似于 <a href="ControlSend.htm">ControlSend</a>, 但在更低的层面).</p>
<p>和 <a href="#SendInputDetail">SendInput</a> 一样, SendPlay 的键击不会夹杂用户输入的内容. 因此, 如果用户碰巧在 SendPlay 发送期间输入了一些内容, 它们会被延迟到发送完后.</p>
<p>尽管 SendPlay 明显比 SendInput 慢, 但它通常比传统的 <a href="#SendEvent">SendEvent</a> 模式更快 (即使在 <a href="SetKeyDelay.htm">按键延迟</a> 为 -1 时).</p>
<p>SendPlay 无法触发其中调用了 Windows 键 (LWin 和 RWin) 的系统热键. 例如, 它不能显示开始菜单或使用 Win-R 来显示运行对话框.</p>
<p>如果安装了 <a href="_InstallKeybdHook.htm">键盘钩子</a> 则在 SendPlay 发送期间会自动屏蔽 Windows 键 (LWin 和 RWin). 这样可以避免在发送期间当用户无意按了 Windows 键时显示开始菜单. 与之相比, LWin 和 RWin 之外的其他按键不需要屏蔽, 因为操作系统会自动把它们延迟到 SendPlay 执行完后 (通过缓冲).</p>
<p>SendPlay 不使用 SetKeyDelay 和 SetMouseDelay 的标准设置. 作为替代, 默认时它没有延迟, 这可以改变, 例如:</p>
<pre><a href="SetKeyDelay.htm">SetKeyDelay</a>, 0, 10, <strong>Play</strong>  <em>; 请注意 0 和 -1 在 SendPlay 模式中是一样的.</em>
<a href="SetMouseDelay.htm">SetMouseDelay</a>, 10, <strong>Play</strong></pre>
<p>SendPlay 无法切换 Capslock, Numlock 或 Scroll-lock 按键的状态. 同样地, 如果键击发送到脚本自身的窗口时, 则它才能改变由 <a href="GetKeyState.htm">GetKeyState</a> 获取的按键状态. 即使在这时, 对左/右修饰键的任何改变 (例如 RControl) 只能通过它们的中性副本检测到 (例如 Control). 并且, SendPlay 还有在 <a href="SendMode.htm#Play">SendMode 页面</a> 描述的其他限制.</p>
<p>与 <a href="#SendInputDetail">SendInput</a> 和 <a href="#SendEvent">SendEvent</a> 不同, 用户可以通过按下 Control-Alt-Del 或 Control-Escape 打断 SendPlay 的发送. 这种情况发生时, 剩余的键击不会被发送, 但脚本会像 SendPlay 正常结束一样继续执行.</p>
<p>尽管 SendPlay 能发送 LWin 和 RWin 事件, 但它们被直接发送到活动窗口而不执行它们原本的操作系统功能. 要变通解决此问题, 使用 <a href="#SendEvent">SendEvent</a>. 例如, <em>SendEvent #r</em> 会显示开始菜单的运行对话框.</p>
<p>与 SendInput 不同, 即使在 Windows 95 和 NT4 SP3 之前的系统中 SendPlay 也能使用.</p>
<h2>相关</h2>
<p><a href="SendMode.htm">SendMode</a>, <a href="SetKeyDelay.htm">SetKeyDelay</a>, <a href="SetStoreCapslockMode.htm">SetStoreCapslockMode</a>, <a href="_EscapeChar.htm">转义序列 (e.g. `%) </a>, <a href="ControlSend.htm">ControlSend</a>, <a href="BlockInput.htm">BlockInput</a>, <a href="../Hotstrings.htm">Hotstrings</a>, <a href="WinActivate.htm">WinActivate</a></p>
<h2>示例</h2>
<pre class="NoIndent">Send Sincerely,{enter}John Smith <em>; 输入两行的签名.</em>
Send !fs <em>; 选择 File-&gt;Save 菜单 (Alt+F 后面跟着 S).</em>
Send {End}+{Left 4} <em>; 跳到文本的末尾然后发送四次 shift 和左方向键组合的键击.</em>
SendInput <a href="#Raw">{Raw}</a>使用最快的方法发送一长系列的原始字符 (<a href="#SendInputDetail">SendInput</a>).</pre>

</body>
</html>
